package com.jinyuan.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Properties;

import android.content.Context;
import android.util.Log;

/**
 * .properties配置文件工具类
 * 
 * @author Azuryleaves
 * 
 */
public class PropertiesUtil {

	private final static String LOG_TAG = "PropertiesUtil";

	/**
	 * 读取.properties配置文件
	 * 
	 * @param fileName
	 *            配置文件名
	 * @return
	 */
	public static Properties getProperties(Context context, String fileName) {
		Properties props = new Properties();
		// InputStream in = PropertiesUtil.class.getResourceAsStream(fileName); //-- 根目录(src下)下一个名为netconfig.properties的文件
		try {
			props.load(context.openFileInput(fileName));
		} catch (IOException e) {
			e.printStackTrace();
			Log.e(LOG_TAG, fileName + " IO Exception", e);
		}
		return props;
	}

	/**
	 * 获取.properties配置文件属性值
	 * 
	 * @param fileName
	 *            配置文件名
	 * @param propertyKey
	 *            属性key
	 * @return
	 */
	public static String getProperty(Context context, String fileName,
			String propertyName) {
		return getProperties(context, fileName).getProperty(propertyName);
	}

	/**
	 * 写入.properties配置文件
	 * 
	 * @param context
	 * @param fileName
	 *            配置文件名
	 * @param propertyKey
	 *            属性key
	 * @param propertyValue
	 *            属性value
	 * 
	 *            Context.Mode的含义如下：
	 *            1.MODE_PRIVATE:为默认操作模式，代表该文件是私有数据，只能被应用本身访问，
	 *            在该模式下，写入的内容会覆盖原文件的内容。
	 *            2.MODE_APPEND:代表该文件是私有数据，只能被应用本身访问，该模式会检查文件是否存在
	 *            ，存在就往文件追加内容，否则就创建新文件。 3.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
	 *            4.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
	 *            注：.properties文件放置的路径为/data/data/packagename/files
	 * 
	 * @return
	 */
	public static boolean setProperties(Context context, String fileName,
			String propertyKey, String propertyValue) {
		Properties props = new Properties();
		try {
			props.load(context.openFileInput(fileName));
			OutputStream out = context.openFileOutput(fileName,
					Context.MODE_PRIVATE);
			Enumeration<?> e = props.propertyNames();
			if (e.hasMoreElements()) {
				while (e.hasMoreElements()) {
					String s = (String) e.nextElement();
					if (!s.equals(propertyKey)) {
						props.setProperty(s, props.getProperty(s));
					}
				}
			}
			props.setProperty(propertyKey, propertyValue);
			props.store(out, null);
			String value = props.getProperty(propertyKey);
			System.out.println(propertyKey + " --- " + value);
			return true;
		} catch (FileNotFoundException e) {
			Log.e(LOG_TAG, fileName + " Not Found Exception", e);
			return false;
		} catch (IOException e) {
			Log.e(LOG_TAG, fileName + " IO Exception", e);
			return false;
		}
	}

	/**
	 * 读取.properties配置文件(SDCard)
	 * @param path 配置文件名(含路径)
	 * @return
	 */
	public static Properties loadProperties(String path) {
		Properties properties = new Properties();
		try {
			FileInputStream s = new FileInputStream(path);
			properties.load(s);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return properties;
	}

	/**
	 * 保存.properties配置文件(SDCard)
	 * @param context
	 * @param path 配置文件名(含路径)
	 * @param properties
	 * @return
	 */
	public static boolean saveProperties(Context context, String path,
			Properties properties) {
		try {
			File file = new File(path);
			if (!file.exists()){
//				new File(file.getPath()).mkdirs();
				file.createNewFile();
				System.out.println("--------配置文件不存在-------");
			}
			FileOutputStream s = new FileOutputStream(file);
			properties.store(s, "");
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	/**
	 * 读取.properties配置文件属性值(SDCard)
	 * put方法可以直接修改配置信息，不会重复添加
	 * get出来的都是Object对象, 如果是基本类型, 需要用到封装类
	 * @param context
	 */
	public static String loadProperty(String fileName,
			String propertyName) {
		Properties prop = loadProperties(fileName);
		return (String) prop.get(propertyName);
	}
	
}
